#!/usr/bin/env python
#-*- coding: utf-8 -*-


import os
import logging

from google.appengine.ext               import webapp
from google.appengine.ext.webapp.util   import login_required
from google.appengine.ext.webapp        import template
from google.appengine.api               import users
from google.appengine.ext               import db

import models
import stuff


_DEBUG = True


class BaseRequestHandler(webapp.RequestHandler):
    """ Реализует общую функцию генерации темплейтов и получает основные данные """

    def initialize(self, request, response):
        """ Инициализация общих данных """

        webapp.RequestHandler.initialize(self, request, response)

        logging.debug(self.__str__)

        self.data = {
            'request' : self.request,
            'user' : users.get_current_user(),
            'login_url': users.create_login_url(self.request.uri),
            'logout_url': users.create_logout_url('http://%s/' % (self.request.host,)),
            'application_name': 'boardgames.gamezone',
            'game_boxes' : stuff.GAME_BOXES,
            }

    @login_required
    def generate(self, template_name, template_data={}):
        """ Трансформирование шаблонов """

        logging.debug('transform')

        self.data.update(template_data)
        path = os.path.join(os.path.dirname(__file__) + "/templates/", template_name + ".html")
        self.response.out.write(template.render(path, self.data, debug=_DEBUG))


class Page404(BaseRequestHandler):
    """ Обработчик 404 страницы """
    def get(self):
        self.generate('404')


class PageMain(BaseRequestHandler):
    """ Начальная страница, список игр с участием пользователя """

    def get(self):
        games = models.Game.get_current_user_games()
        self.generate('index', { 'games': games  })


class PageNew(BaseRequestHandler):
    """ Создание новой игры """

    def post(self):
        type = int(self.request.get('type'))
        if not type:
            self.error(403)
            return
        game = models.Game(type=type)
        game.put()
        game_member = models.GameMember(game=game, user=self.data['user'])
        game_member.put()
        self.redirect('/game/?id=' + str(game.key()))


class PageAll(BaseRequestHandler):
    """ Все игры системы """

    def get(self):
        games = models.Game.all().fetch(10)
        self.generate('index', { 'games': games  })


class PageGame(BaseRequestHandler):
    """ Страница игры """

    def get_game(self):
        """ Получение запрошенной игры """

        game = models.Game.get(self.request.get('id'))
        if not game:
            self.error(403)
            return
        return game

    def get(self):
        self.generate('game', {
            'game': self.get_game(), })

    def post(self):
        game = self.get_game()
        if self.request.get('join'):
            users = game.get_users()
            if self.data['user'] in users:
                self.error(403)
                return
            game_member = models.GameMember( user = self.data['user'], game = game )
            game_member.put()
            self.redirect('/game/?id=' + str(game.key()))


class PageAction(BaseRequestHandler):
    """ Сортировка игр """

    def post(self):
        list = self.request.get('list', allow_multiple=True)
        if not self.data['user']:
            self.error(403)
            return

        for k in list:
            game = models.Game.get(k)

            if not game or not game.has_current_user():
                self.error(403)
                return

            if self.request.get('close'):
                game.archived = True
                game.put()
            elif self.request.get('delete'):
                for log in game.get_log():
                    log.delete()
                for m in db.Query(models.GameMember).filter('game =', game):
                    m.delete()
                game.delete()

        self.redirect("/")


    def get(self):
        pass
